#include "_appTest.h"
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

int _appTest_testadd(PikaObj *self, int a, int b)
{
    return a + b;
}

char *_appTest_testchar(PikaObj *self)
{
    char *str = "hello world";
    return str;
}

// list数据处理
void _appTest_test_list(PikaObj *self, PikaObj *l)
{
    // 获取list数据的长度
    int len = pikaList_getSize(l);
    for (int i = 0; i < len; i++)
    {
        // 获取list中的第i个数据
        int v = pikaList_getInt(l, i);
        printf("format:%d\n", v);
    }
}

PikaObj *_appTest_test_ret_list(PikaObj *self)
{
    PikaObj *mylist = New_pikaList();
    pikaList_append(mylist, arg_newInt(1));
    pikaList_append(mylist, arg_newFloat(0.5));
    pikaList_append(mylist, arg_newStr("pika"));
    return mylist;
}

// dict数据处理
void _appTest_test_dict(PikaObj *self, PikaObj *d)
{
    // 假设知道了key值
    int a = pikaDict_getInt(d, "a");
    char *b = pikaDict_getStr(d, "b");
    printf("format:a=%d,b=%s\n", a, b);
}

PikaObj *_appTest_test_ret_dict(PikaObj *self)
{
    PikaObj *mydict = New_pikaDict();
    pikaDict_set(mydict, "age", arg_newInt(1));
    pikaDict_set(mydict, "size", arg_newFloat(0.5));
    pikaDict_set(mydict, "name", arg_newStr("pika"));
    return mydict;
}

PikaObj *_appTest_test_read(PikaObj *self)
{
    PikaObj *mydict = New_pikaDict();
    pikaDict_set(mydict, "age", arg_newInt(1));
    pikaDict_set(mydict, "size", arg_newFloat(0.5));
    pikaDict_set(mydict, "name", arg_newStr("pika"));
    return mydict;
}

void _appTest_test_led_init(PikaObj *self)
{
    gpio_config_t led_pin_config;
    led_pin_config.pin_bit_mask = 1 << 4;
    led_pin_config.mode = GPIO_MODE_OUTPUT;
    led_pin_config.intr_type = GPIO_INTR_DISABLE;
    led_pin_config.pull_up_en = GPIO_PULLUP_DISABLE;
    led_pin_config.pull_down_en = GPIO_PULLDOWN_DISABLE;
    gpio_config(&led_pin_config);
}

void _appTest_test_led(PikaObj *self, int a)
{
    if (a == 1)
    {
        gpio_set_level(4, 1);
    }
    else
    {
        gpio_set_level(4, 0);
    }
}

// 延时函数
int test_delay_read()
{
    vTaskDelay(3000 / portTICK_PERIOD_MS);
    return 8;
}
// 全局变量
PikaEventListener *g_pika_user_listener;
// 任务回调的函数
void event_test()
{
    /* 通过某种方式来获得要触发的回调的 ID */
    test_delay_read();
    /* 通过某种方式来获得要触发的回调的 ID */
    uint32_t eventId = 0x01;
    /* 在需要触发回调的时候使用发送信号的函数 */
    uint32_t singalCode = 0x11;
    // 不带参数
    // pika_eventListener_sendSignal(g_pika_user_listener, eventId, singalCode);
    // 带参数
    // pika_eventListener_send(g_pika_user_listener, eventId, arg_newFloat(0.5));
    // 带参数
    pika_eventListener_send(g_pika_user_listener, eventId, arg_newObj(New_pikaListFrom(arg_newFloat(0.5), arg_newFloat(0.6))));

    vTaskDelete(NULL);
}
int _appTest_test_delay(PikaObj *self)
{
    event_test();
    return test_delay_read();
}
// 事件任务注册
void _appTest_test_event(PikaObj *self, Arg *callback)
{
    /* 可以在注册时再初始化事件监听器 */
    if (NULL == g_pika_user_listener)
    {
        pika_eventListener_init(&g_pika_user_listener);
    }
    /* 你需要通过某种方式来生成这个事件的 ID，后面要使用相同的 ID 来触发这个事件 */
    uint32_t eventId = 0x01; // 事件ID需要唯一，后面通过这个ID来出发这个事件
    pika_eventListener_registEventCallback(g_pika_user_listener, eventId, callback);

    // 大小一定要4096，不然会栈溢出
    xTaskCreate(event_test, "event_test", 4096, NULL, 10, NULL);
}
